import axios from 'axios'
import { message } from 'ant-design-vue'
import { useUserStore } from '@/store'
import router from '@/router'

// 创建axios实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    const userStore = useUserStore()
    
    // 添加token到请求头
    if (userStore.accessToken) {
      config.headers.Authorization = `${userStore.tokenType} ${userStore.accessToken}`
    }
    
    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    const { code, data, message: msg } = response.data
    
    // 根据后端返回的code判断请求状态
    if (code === 200) {
      return data
    } else {
      // 不在这里显示错误信息，让具体的API调用处理
      return Promise.reject(response.data)
    }
  },
  async (error) => {
    const { response } = error
    const userStore = useUserStore()
    
    if (response) {
      const { status, data } = response
      
      // 处理认证相关错误
      if (status === 401 || (data && (data.code === 2002 || data.code === 2003))) {
        // Token无效或过期，尝试刷新token
        if (userStore.refreshToken && data.code === 2003) {
          try {
            // 动态导入authApi避免循环依赖
            const { authApi } = await import('./modules/auth')
            const refreshResponse = await authApi.refreshToken(userStore.refreshToken)
            
            // 更新token
            userStore.refreshTokens(refreshResponse)
            
            // 重试原请求
            const originalRequest = error.config
            originalRequest.headers.Authorization = `${userStore.tokenType} ${userStore.accessToken}`
            return request(originalRequest)
            
          } catch (refreshError) {
            // 刷新token失败，跳转到登录页
            message.error('登录已过期，请重新登录')
            userStore.logout()
            router.push('/login')
            return Promise.reject(refreshError)
          }
        } else {
          // 没有refreshToken或token无效，直接跳转登录
          message.error('登录已过期，请重新登录')
          userStore.logout()
          router.push('/login')
        }
      } else {
        // 其他HTTP错误
        switch (status) {
          case 403:
            message.error('没有权限访问该资源')
            break
          case 404:
            message.error('请求的资源不存在')
            break
          case 500:
            message.error('服务器内部错误')
            break
          default:
            // 不在这里显示错误信息，让具体的API调用处理
            break
        }
      }
    } else {
      message.error('网络连接失败')
    }
    
    return Promise.reject(error)
  }
)

export default request